package com.my.main.common.encrypt;

import java.util.Stack;

/**
 * 	进制转换
 * 	@author 韩晗		2015-11-05
 */
public class TransBase {
	
	
	private static final int Offset = 88888888;
	private static final int Base = 62;
	private static final String Words62 = "0123456789aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ";
	
	
//	public static void main(String[] args) {
//		String str = trans(2);
//		System.out.println(str);
//		System.out.println(transInt(str));
//	}
	
	
	/**
	 * 将10进制的整形，转换成62进制的字符串（自动加偏移量）
	 * @param num		长整形
	 * @return
	 */
	public static String trans(int num) {
		
		return trans(num+Offset, Base);
		
	}
	
	
	/**
	 * 将10进制的长整形，转换成62进制的字符串（自动加偏移量）
	 * @param num		长整形
	 * @return
	 */
	public static String trans(long num) {
		
		return trans(num+Offset, Base);
		
	}
	
	
	/**
	 * 将62进制字符串转换成整形（自动减偏移量）
	 * @param numStr	62进制字符串
	 * @return
	 */
	public static int transInt(String numStr) {
		
		return Integer.parseInt(baseNum(numStr, Base)) - Offset;
		
	}
	
	
	/**
	 * 将62进制字符串转换成长整形（自动减偏移量）
	 * @param numStr	62进制字符串
	 * @return
	 */
	public static long transLong(String numStr) {
		
		return Long.parseLong(baseNum(numStr, Base)) - Offset;
		
	}
	

	/**
	 * 将10进制的长整形，转换成其他进制的字符串
	 * @param num		整数
	 * @param base		进制(1-62)
	 * @return			转换后的字符串
	 */
	public static String trans(long num, int base) {
		
		StringBuffer str = new StringBuffer("");
		Stack<Character> s = new Stack<Character>();
		
		while(num != 0){
			s.push(Words62.charAt((int)num%base));
			num/=base;
		}
		while(!s.isEmpty()){
			str.append(s.pop());
		}
		
		return str.toString();
		
	}
	
	
	/**
	 * 将其他进制的数字字符串转换回10进制整形
	 * @param num			源字符型整数
	 * @param originBase	源字符型整数的进制
	 * @return
	 */
	public static String baseNum(String num, int srcBase) {
		
		if(srcBase == 10){
			return num;
		}
		
		char[] chars = num.toCharArray();
		int len = chars.length;

		long n = 0L;
		for(int i=len-1; i>=0; i--){
			n += Words62.indexOf(chars[i]) * Math.pow(srcBase, len-i-1);
		}
		
		return n + "";
	}
}
